home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
DC_VIEW
/
DCMAIN.C
< prev
next >
Wrap
Text File
|
1995-03-20
|
31KB
|
945 lines
/******************************************************************************
* DCmain.c: DC_View for SX-Window 1995.02.13 f.ogasawara
******************************************************************************
*
*
*/
#include <zmusic.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stat.h>
#include <io.h>
#include <jfctype.h>
#include <doslib.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "DC.h" /* このプログラム固有のヘッダファイル */
char _sxkernelcomm[] = SXKERNEL; /* カーネル起動コマンド */
static int mojiFlag;
static char moji[256];
/******************************************************************************
* main(): メイン関数
******************************************************************************
*/
int main(void)
{
ComVal cv; /* 共通変数 */
if (!init(&cv)) { /* 初期化処理を行う */
showErrDialog(&cv); /* エラーダイアログを表示する */
cv.endFlag = TRUE; /* 終了フラグをセットする */
}
/* 終了フラグがセットされるまでループする */
while (!cv.endFlag) {
cv.errorCode = 0; /* エラーコードをクリアする */
/* タスクマンからイベントを取得する */
TSEventAvail(cv.eventMask, &cv.event);
/* 各イベントに対応した処理を行う */
switch (cv.event.ts.what) {
case E_MSLDOWN: /* マウスレフトダウンイベント */
msLDownEvent(&cv);
break;
case E_MSRDOWN: /* マウスライトダウンイベント */
msRDownEvent(&cv);
break;
case E_IDLE: /* アイドルイベント */
IdleEvent(&cv);
break;
case E_KEYDOWN: /* キーダウンイベント */
keyDownEvent(&cv);
break;
case E_UPDATE: /* アップデートイベント */
updateEvent(&cv);
break;
case E_ACTIVATE: /* アクティベートイベント */
activateEvent(&cv);
break;
case E_SYSTEM1: /* システムイベント */
case E_SYSTEM2:
systemEvent(&cv);
break;
}
if (cv.errorCode != 0) /* エラーが発生したか? */
showErrDialog(&cv); /* エラーダイアログを表示する */
}
/* 終了手続きを行う */
endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
return 0;
}
/******************************************************************************
* init(): 初期化処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 初期化成功
* = FALSE: 初期化失敗(終了)
* 注釈: 共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
* 表示などを行う。
*/
BOOLEAN init(ComVal *pcv)
{
int i;
Rect rc = { 18, 0, WIN_H, WIN_V - 20 };
Rect txtrc = { 0, 0, WIN_H, WIN_V - 20 };
pcv->windowPtr = NULL; /* ウィンドウポインタ */
pcv->activeFlag = FALSE; /* アクティブフラグ */
pcv->eventMask = EVENTMASK; /* イベントマスク */
pcv->errorCode = 0; /* エラーコード */
pcv->endFlag = FALSE; /* 終了フラグ */
pcv->hResMap = NULL; /* リソースマップのハンドル */
pcv->menuHdl = NULL; /* メニューハンドル */
pcv->updateRgnHdl = NULL; /* テキスト表示 */
pcv->txtRgnHdl = NULL;
pcv->winRgnHdl = NULL;
pcv->txt = NULL;
pcv->txtNo = NULL;
pcv->ofset = 0;
pcv->scrollFlag = 0;
pcv->scrollDir = 0;
pcv->pastFno = 0;
pcv->view = rc; /* view rectangle */
pcv->pre_esc = 0; /* テキスト処理 */
pcv->loadFlag = 0;
pcv->mloadFlag = 0;
pcv->currentPath[0] = 0;
strcpy(pcv->a_drv, "A:");
strcpy(pcv->b_drv, "B:");
pcv->cutNo = 1; /* cutfile load */
pcv->txtRgnHdl = GMNewRgn();
pcv->winRgnHdl = GMNewRgn();
for(i=0;i<<20;i++) {
pcv->bitsH[i] = NULL;
pcv->offgraphOK[i] = 0;
}
pcv->mojiFlag = 0; /* 文字列検索 */
pcv->status = 0;
strcpy(pcv->title, "DC_VIEW"); /* タイトル */
TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する */
if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
pcv->errorCode = 1; /* バージョン2より古い */
return FALSE; /* 失敗したのでFALSEを返す */
}
if (!openResource(pcv)) { /* リソースファイルを読み込む */
/* オープンできなかった */
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
pcv->menuHdl = TSReferMN(128); /* メニューハンドルの取得 */
(_Handle *) pcv->pcmHdl = TSRscGet('pram', 128); /* 環境読み込み*/
(_Handle *) pcv->mzHdl = TSRscGet('pram', 129);
(_Handle *) pcv->picHdl = TSRscGet('pram', 130);
(_Handle *) pcv->envHdl = TSRscGet('pram', 131);
if (pcv->pcmHdl == NULL || pcv->mzHdl == NULL
|| pcv->picHdl == NULL || pcv->envHdl == NULL) {
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
pcv->mzTask = (int)(**pcv->mzHdl); /* 起動プログラム */
pcv->pcmTask = (int)(**pcv->pcmHdl);
pcv->picTask = (int)(**pcv->picHdl);
pcv->scrollstep = (int)(**pcv->envHdl);
pcv->cutDisp = (int)(*((*pcv->envHdl) + 1));
pcv->lineDisp = (int)(*((*pcv->envHdl) + 2));
strcpy(pcv->mzFname, (*pcv->mzHdl) + 1);
strcpy(pcv->mzOpt, (*pcv->mzHdl) + 91);
strcpy(pcv->pcmFname, (*pcv->pcmHdl) + 1);
strcpy(pcv->pcmOpt, (*pcv->pcmHdl) + 91);
strcpy(pcv->picFname, (*pcv->picHdl) + 1);
strcpy(pcv->picOpt, (*pcv->picHdl) + 91);
if (!createWindow(pcv)) { /* ウィンドウを作成する */
pcv->errorCode = 2; /* 作成できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
GMAPage(G_PAGE0 | G_PAGE1 | G_PAGE2);
GMBackColor(G_BLACK);
GMForeColor(G_WHITE);
GMFontKind(G_ROM12);
GMFontMode(G_PSET);
GMPenMode(G_FORE | G_PSET);
GMFontFace(G_PLANE);
WMShow(pcv->windowPtr); /* ウィンドウを表示する */
GMAndRectRgn(pcv->txtRgnHdl, pcv->windowPtr->graph.clipping, &txtrc);
GMCopyRgn(pcv->winRgnHdl, pcv->windowPtr->graph.clipping);
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* openResource(): リソースファイルのオープン
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗(終了)
*/
BOOLEAN openResource(ComVal *pcv)
{
int errCode; /* エラーコード */
Task tsbuf; /* タスク管理レコード */
char drv[2], path[65], node[19], ext[5];
char name[23], fileName[TS_NAMEMAX];
char szFile[TS_NAMEMAX]; /* フルパスでファイル名が戻るバッファ */
/* リソースファイルのオープン&読み込み */
EMEnCross();
/* タスク名を取得する */
TSGetTdb(&tsbuf, TS_OWN);
/* タスク名を分解 */
strsfn(tsbuf.name, drv, path, node, ext);
/* 検索パスを作成 */
strmfn(szFile, drv, path, "", "");
/* リソースファイルを検索 */
errCode = TSSearchFile("DC_VIEW.LB", szFile, szFile);
strcpy(pcv->lbFname, szFile);
if (errCode < 0) {
EMDeCross();
/* 待ち状態を示すマウスポインタを元に戻す */
DMError(D_CONFIRM, "リソースファイル「DC_VIEW.LB」が\r"
"見付かりません。");
return FALSE;
}
/* リソースのオープン,リソースマップの獲得 */
pcv->hResMap = TSResOpen(szFile);
if (pcv->hResMap == NULL) {
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
DMError(D_CONFIRM, "リソースファイル「DC_VIEW.LB」が\r"
"オープンできません。");
return FALSE;
}
/* すべてのリソースを読み込む(ファイルはクローズされる)*/
errCode = TSResLoad();
if (errCode < 0) {
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
DMError(D_CONFIRM, "リソースファイルの読み込みに\r"
"失敗しました。");
return FALSE;
}
EMDeCross();
}
/******************************************************************************
* createWindow(): ウィンドウの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 作成成功
* = FALSE: 作成失敗(終了)
*/
BOOLEAN createWindow(ComVal *pcv)
{
int paramFlags; /* パラメータの有無 */
Rect rc,rc2;
Task task; /* タスク管理レコード */
int ret,do_load = 0;
char name[256];
static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
paramFlags = TSTakeParam( /* コマンドラインを解析する */
task.command, /* コマンドライン */
&rc, /* 指定されたウィンドウ位置 */
name, /* 最終文字列を格納する */
0, /* アドレステーブルを保存しない */
NULL, /* アドレステーブルを作成しない */
NULL); /* ポインタを確保しない */
if (!(paramFlags & 1)) { /* ウィンドウ位置の指定があるか? */
/* ない場合、システムからウィンドウの左上座標を取得する */
rc = winSize;
GMSlideRect(&rc, TSGetWindowPos());
} else {
rc2 = rc;
rc = winSize;
rc.d.top = rc.d.top + rc2.d.top;
rc.d.right = rc.d.right + rc2.d.left ;
rc.d.bottom = rc.d.bottom + rc2.d.top;
rc.d.left = rc.d.left + rc2.d.left ;
}
pcv->windowPtr = WMOpen( /* ウィンドウをオープンする */
NULL, /* ウィンドウポインタを確保する */
&rc, /* ウィンドウの表示位置 */
WINTITLE, /* ウィンドウタイトル */
FALSE, /* オープン時に描画しない */
WI_STD2 << 4, /* タイトルの広い標準ウィンドウ */
W_FRONT, /* 一番手前に表示する */
TRUE, /* クローズボタンを使用する */
TSGetID()); /* 自分のタスクID */
if (pcv->windowPtr == NULL)
return FALSE; /* 失敗したのでFALSEを返す */
structControl(pcv); /* コントロールの作成 */
if ((paramFlags & 2)==2) { /* 文字列の指定があるか? */
GetData(pcv, name);
}
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* structControl(): コントロールの作成
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
*/
void structControl(ComVal *pcv)
{
pcv->btn1Hdl=TSReferCM(128,pcv->windowPtr);
pcv->btn2Hdl=TSReferCM(129,pcv->windowPtr);
pcv->btn3Hdl=TSReferCM(130,pcv->windowPtr);
pcv->btn4Hdl=TSReferCM(131,pcv->windowPtr);
pcv->btn5Hdl=TSReferCM(132,pcv->windowPtr);
pcv->btn6Hdl=TSReferCM(133,pcv->windowPtr);
pcv->btn7Hdl=TSReferCM(134,pcv->windowPtr);
pcv->btn8Hdl=TSReferCM(135,pcv->windowPtr);
pcv->btn9Hdl=TSReferCM(136,pcv->windowPtr);
pcv->btn92Hdl=TSReferCM(142,pcv->windowPtr);
pcv->btn93Hdl=TSReferCM(143,pcv->windowPtr);
pcv->btn10Hdl=TSReferCM(137,pcv->windowPtr);
pcv->btn11Hdl=TSReferCM(138,pcv->windowPtr);
pcv->btn12Hdl=TSReferCM(139,pcv->windowPtr);
pcv->volHdl=TSReferCM(140,pcv->windowPtr);
}
/******************************************************************************
* msLDownEvent(): マウスレフトダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
* この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
*/
void msLDownEvent(ComVal *pcv)
{
int partCode; /* ウィンドウのパートコード */
Window *wTemp; /* テンポラリウィンドウポインタ */
Rect comRc = { 0, 0, 18, WIN_V - 20 }; /* コマンド領域 */
Rect btnRc = { 0, 361, WIN_H, WIN_V }; /* ボタン領域 */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
/* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
/* ウィンドウをアクティブにする */
WMSelect(pcv->windowPtr);
/* ボタンが押された場所のパートコードを取得する */
partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
/* タイトルバー以外か、左ボタンが離されたか? */
if (partCode != W_INDRAG || !EMLStill()) {
return;
}
}
/* マウスのボタンが押されている間、ウィンドウの各種処理をシス
テムに任せて、ボタンが離された場所のパートコードを取得する */
partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
if (partCode == W_INCLOSE) /* クローズボタンか? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
if (partCode == W_ININSIDE) { /* ウィンドウの内側 */
if (GMPtInRect(&pcv->view, EMMSLoc())) {
if (EMRBttn()) { /* 左右ボタンともに押されている */
retpastf(pcv);
return;
}
pcv->scrollFlag = scrollTxt(pcv, 1);
}
if (GMPtInRect(&comRc, EMMSLoc())) { /* 'TYPE='解読 */
nextfile(pcv);
}
if (GMPtInRect(&btnRc, EMMSLoc())) { /* control check */
checkControl(pcv);
}
}
}
}
/******************************************************************************
* checkControl(): コントロールのチェック
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void checkControl(ComVal *pcv)
{
int partCode; /* コントロールのパートコード */
int val; /* コントロールの値 */
Control **ctrlHdl; /* コントロールハンドル */
char str[16], execfname[90], command[90];
int sclbuff;
char *txtPt;
int *txtNo;
int i,rtn;
/* マウスのボタンが押されている間、コントロールの各種処理をシステムに
任せて、コントロールハンドルとボタンが離された場所のパートコードを
取得する */
partCode = SXCallCtrlM(pcv->windowPtr, &pcv->event, 0, 0, 0, &ctrlHdl);
if (pcv->loadFlag == 0) /* テキストが未表示なら戻る */
return;
switch (partCode) {
case C_INBTTN: /* 文字ボタン */
/* ボタン1か(行頭処理)? */
if (ctrlHdl == pcv->btn1Hdl && pcv->ofset != 0) {
pcv->ofset = 0;
drawGraph(pcv ,0); /* テキスト全体を書き替え */
break;
}
/* ボタン2か(行末処理)? */
if (ctrlHdl == pcv->btn2Hdl) {
pcv->ofset = pcv->Maxline - 29;
drawGraph(pcv ,0); /* テキスト全体を書き替え */
break;
}
/* ボタン3か(前項処理)? */
if (ctrlHdl == pcv->btn3Hdl && pcv->ofset > 0) {
pcv->ofset = pcv->ofset - 29;
if (pcv->ofset < 0)
pcv->ofset =0;
drawGraph(pcv ,0); /* テキスト全体を書き替え */
break;
}
/* ボタン4か(次項処理)? */
if (ctrlHdl == pcv->btn4Hdl && pcv->ofset < pcv->Maxline - 29) {
pcv->ofset = pcv->ofset + 29;
if (pcv->ofset + 29 > pcv->Maxline)
pcv->ofset = pcv->Maxline - 29;
drawGraph(pcv ,0); /* テキスト全体を書き替え */
break;
}
/* ボタン5か(改区前処理)? */
if (ctrlHdl == pcv->btn5Hdl) {
MMHdlLock(pcv->txt);
MMHdlLock(pcv->txtNo);
txtPt = *(pcv->txt);
txtNo = *(pcv->txtNo);
for (i=pcv->ofset - 1;i>0;i--) {
if (!strncmp("━", (txtPt + *(txtNo + i)), 2))
break;
}
MMHdlUnlock(pcv->txtNo);
MMHdlUnlock(pcv->txt);
if (i<0)
break;
pcv->ofset = i;
drawGraph(pcv ,0); /* テキスト全体を書き替え */
break;
}
/* ボタン6か(改区後処理)? */
if (ctrlHdl == pcv->btn6Hdl) {
MMHdlLock(pcv->txt);
MMHdlLock(pcv->txtNo);
txtPt = *(pcv->txt);
txtNo = *(pcv->txtNo);
for (i=pcv->ofset + 1;i<pcv->Maxline;i++) {
if (!strncmp("━", (txtPt + *(txtNo + i)), 2))
break;
}
MMHdlUnlock(pcv->txtNo);
MMHdlUnlock(pcv->txt);
if (i>pcv->Maxline)
break;
if (i>pcv->Maxline - 29)
i = pcv->Maxline - 29;
pcv->ofset = i;
drawGraph(pcv ,0); /* テキスト全体を書き替え */
break;
}
/* ボタン7か(前行処理)? */
if (ctrlHdl == pcv->btn7Hdl && pcv->ofset > 0) {
sclbuff = pcv->scrollstep;
pcv->scrollstep = 1;
scrollTxt(pcv, -1);
pcv->scrollstep = sclbuff;
break;
}
/* ボタン8か(次行処理)? */
if (ctrlHdl == pcv->btn8Hdl && pcv->ofset < pcv->Maxline - 29) {
sclbuff = pcv->scrollstep;
pcv->scrollstep = 1;
scrollTxt(pcv, 1);
pcv->scrollstep = sclbuff;
break;
}
/* ボタン9か(検索処理)? */
if (ctrlHdl == pcv->btn9Hdl) {
if ((rtn = dialogProc5(pcv, 0)) >= 0) {
pcv->ofset = pcv->ofset - 15;
if (pcv->status + 29 > pcv->Maxline)
pcv->ofset = pcv->Maxline - 29;
else if (pcv->status < 15)
pcv->ofset = 0;
rtn = (rtn - pcv->ofset) * 12 + 12;
drawGraph(pcv ,0);
i = GMForeColor(G_RED);
GMMove(LONGWORD( 6, rtn));
GMLine(LONGWORD(582, rtn));
GMForeColor(i);
CMShine(pcv->btn92Hdl,C_ACTIVE);
CMShine(pcv->btn93Hdl,C_ACTIVE);
}
break;
}
/* ボタン92か(全域検索処理)? */
if (ctrlHdl == pcv->btn92Hdl) {
if ((rtn = dialogProc5(pcv, 1)) >= 0) {
pcv->ofset = pcv->ofset - 15;
if (pcv->status + 29 > pcv->Maxline)
pcv->ofset = pcv->Maxline - 29;
else if (pcv->status < 15)
pcv->ofset = 0;
rtn = (rtn - pcv->ofset) * 12 + 12;
drawGraph(pcv ,0);
i = GMForeColor(G_RED);
GMMove(LONGWORD( 6, rtn));
GMLine(LONGWORD(582, rtn));
GMForeColor(i);
}
break;
}
/* ボタン93か(次検索処理)? */
if (ctrlHdl == pcv->btn93Hdl) {
if ((rtn = dialogProc5(pcv, 2)) >= 0) {
pcv->ofset = pcv->ofset - 15;
if (pcv->status + 29 > pcv->Maxline)
pcv->ofset = pcv->Maxline - 29;
else if (pcv->status < 15)
pcv->ofset = 0;
rtn = (rtn - pcv->ofset) * 12 + 12;
drawGraph(pcv ,0);
i = GMForeColor(G_RED);
GMMove(LONGWORD( 6, rtn));
GMLine(LONGWORD(582, rtn));
GMForeColor(i);
}
break;
}
/* ボタン10か(演奏再開処理)? */
if (ctrlHdl == pcv->btn10Hdl && pcv->mloadFlag) {
if (pcv->mzTask != 0) {
sprintf(command, " %s", pcv->mzOpt);
pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
sprintf(command, " %s", pcv->zmsfname);
pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
} else {
exec_zms("(P)");
}
break;
}
/* ボタン11か(演奏停止処理)? */
if (ctrlHdl == pcv->btn11Hdl && pcv->mloadFlag) {
exec_zms("(S)");
break;
}
/* ボタン12か(復帰処理)? */
if (ctrlHdl == pcv->btn12Hdl) {
retpastf(pcv);
break;
}
case C_INTHUMB: /* スライドボリューム */
if (ctrlHdl == pcv->volHdl) {
pcv->ofset = CMValueGet(pcv->volHdl);
drawGraph(pcv ,0); /* テキスト全体を書き替え */
}
break;
}
}
/******************************************************************************
* msRDownEvent(): マウスライトダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
* この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
*/
void msRDownEvent(ComVal *pcv)
{
int partCode,mpos; /* ウィンドウのパートコード */
Window *wTemp; /* テンポラリウィンドウポインタ */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
/* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
return;
}
/* マウスのボタンが押されている間、ウィンドウの各種処理をシス
テムに任せて、ボタンが離された場所のパートコードを取得する */
partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
if (partCode == W_INDRAG) { /* ドラッグリージョン */
selectMenu(pcv); /* メニューの作成と選択処理を行う */
return;
}
if (partCode == W_ININSIDE) { /* ウィンドウの内側 */
if (EMLBttn()) { /* 左右ボタンともに押されている */
retpastf(pcv);
return;
}
if (GMPtInRect(&pcv->view, EMMSLoc())) /* 逆scroll */
pcv->scrollFlag = scrollTxt(pcv, -1);
}
}
}
/******************************************************************************
* selectMenu(): ポップアップメニューの作成と選択処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void selectMenu(ComVal *pcv)
{
int num;
num = MNSelect( /* メニューの表示と選択を行う */
pcv->menuHdl, /* メニューハン ドル */
pcv->event.ev.where.x_y); /* マウスの右ボタンが押された位置 */
switch (num) {
case 1: /* about me... */
dialogProc1(pcv);
break;
case 2:
break;
case 3: /* ドライブパス設定 */
dialogProc2(pcv);
break;
case 4: /* 表示諸設定 */
dialogProc3(pcv);
break;
case 5: /* 起動プログラム設定 */
dialogProc4(pcv);
break;
case 6:
break;
case 7:
pcv->endFlag = TRUE; /* 終了フラグをセットする */
break;
}
}
/******************************************************************************
* dialogProc1(): ダイアログの作成、表示 (about me)
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void dialogProc1(ComVal *pcv)
{
Dialog *dialogPtr;
Graph *lastGraph;
dialogPtr = TSReferDM(128,NULL,W_FRONT);
lastGraph = GMGetGraph(); /* カレントグラフを退避する */
/* ダイアログをカレントグラフにする */
GMSetGraph(&dialogPtr->window.graph);
GMAPage(G_ALLPAGE);
GMFontKind(G_ROM12);
GMFontFace(G_BOLD);
GMShadowStrZ("電脳倶楽部書類を表示します。", LONGWORD(30,72));
GMShadowStrZ("F.Ogasawara 1995",LONGWORD(60,100));
DMControl(NULL);
DMDispose(dialogPtr); /* ダイアログを廃棄する */
GMSetGraph(lastGraph); /* カレントグラフを元に戻す */
}
/******************************************************************************
* IdleEvent(): アイドルイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void IdleEvent(ComVal *pcv)
{
Rect rc = {0, 0, WIN_H, WIN_V};
if (pcv->scrollFlag) {
if (EMLBttn() || EMRBttn()) { /* マウスのボタンが押されているか? */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr)
scrollTxt(pcv, pcv->scrollDir);
} else {
pcv->scrollFlag = FALSE; /* スクロールは終了した */
}
}
if (GMPtInRect(&rc, EMMSLoc()) /* マウスポインタ行番号表示 */
&& (pcv->event.ev.whom.win == pcv->windowPtr)) {
setlnum(pcv);
}
}
/******************************************************************************
* keyDownEvent(): キーダウンイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: OPT.1+'Q'キーでの終了処理を行う。
*/
void keyDownEvent(ComVal *pcv)
{
int shortCut; /* ショートカットキー */
if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか? */
/* キー入力した文字を大文字に変換する */
shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
if (shortCut == 'Q') /* 終了か? */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
}
}
/******************************************************************************
* updateEvent(): アップデート処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈:
* アップデート処理としてウィンドウ内部を描画する。
* この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
* イベントの処理ができなくなります。
*/
void updateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
WMUpdate(pcv->windowPtr); /* アップデートを開始する */
drawGraph(pcv ,0); /* テキスト全体を書き替え */
WMUpdtOver(pcv->windowPtr); /* アップデートを終了する */
}
}
/******************************************************************************
* drawGraph(): ウィンドウ内部の描画
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void drawGraph(ComVal *pcv, int sel)
{
Rect rc = {520, 363, 554, 379};
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
drawtxt(pcv, sel);
CMValueSet(pcv->volHdl, pcv->ofset);
if (pcv->mloadFlag == 0) { /* ZMSファイルロード済み? */
CMShine(pcv->btn10Hdl, C_INACTIVE);
CMShine(pcv->btn11Hdl, C_INACTIVE);
}
if (pcv->mojiFlag == 0) { /* 検索文字指定済み? */
CMShine(pcv->btn92Hdl, C_INACTIVE);
CMShine(pcv->btn93Hdl, C_INACTIVE);
}
if (pcv->pastFno == 0) /* 下層テキストロード済み? */
CMShine(pcv->btn12Hdl, C_INACTIVE);
CMDraw(pcv->windowPtr);
if (pcv->loadFlag && pcv->lineDisp) { /* 行番号表示 */
GMShadowRect(&rc);
setlnum(pcv);
}
}
/******************************************************************************
* setlnum(): 行番号表示
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void setlnum(ComVal *pcv)
{
int mpos;
int comline;
char buff[10];
if (!pcv->lineDisp || pcv->loadFlag == 0)
return;
GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
mpos = (int)LOWWORD(EMMSLoc());
comline = pcv->ofset + (mpos / 12) + 1;
if (mpos > 380) {
strcpy(buff, "~BAR~");
} else if (mpos >360) {
strcpy(buff, "_BAR_");
} else {
sprintf(buff, "%5d", comline);
}
GMMove(LONGWORD(521,364));
GMDrawStrZ(buff);
}
/******************************************************************************
* activateEvent(): アクティベートイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: アクティブ、インアクティブによるアクティブフラグの切り替えと、
* イベントマスクの切り替えを行う。
*/
void activateEvent(ComVal *pcv)
{
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
pcv->activeFlag = TRUE; /* アクティブフラグをセットする */
/* アクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK | EM_KEYDOWN;
/* イベントが他のウィンドウで、自分がアクティブ状態か? */
} else if (pcv->activeFlag) {
pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
/* インアクティブ時のイベントマスクをセットする */
pcv->eventMask = EVENTMASK;
}
}
/******************************************************************************
* systemEvent(): システムイベント処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 注釈: 全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
* 対応した処理を行う。
*/
void systemEvent(ComVal *pcv)
{
switch (pcv->event.ts.what2) { /* イベントの種類は? */
case CLOSEALL: /* 全ウィンドウのクローズ */
case ENDTSK: /* 全タスクの終了 */
pcv->endFlag = TRUE; /* 終了フラグをセットする */
break;
case WINDOWSELECT: /* ウィンドウのセレクト */
WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
break;
case DRAGEND: /* ドラッグの終了 */
/* イベントが自分のウィンドウか? */
if (pcv->event.ev.whom.win == pcv->windowPtr) {
/* ラバーバンドを消去する */
TSHideDrag();
/* アイコンのドロップ処理を行う */
dropIcon(pcv);
}
break;
}
}
/******************************************************************************
* showErrDialog(): エラーダイアログの表示
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void showErrDialog(ComVal *pcv)
{
int i;
static struct { /* エラー情報 */
int code; /* エラーコード */
int manager; /* 使用するマネージャ */
int flag; /* 表示フラッグ */
char *message; /* エラーメッセージ */
} errInfo[] = {
{ 1, 1, D_RED, "SX SYSTEMのバージョンが違います。" },
{ 2, 2, D_RED, "ウィンドウが作成できません。" },
{ 0, 1, D_YELLOW, "エラーが発生しました。" }
};
for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す */
if (errInfo[i].code == pcv->errorCode)
break;
switch (errInfo[i].manager) { /* マネージャの選択 */
case 1: /* ダイアログマン */
DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
case 2: /* タスクマン */
TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
break;
}
}
/******************************************************************************
* endProc(): 終了手続き
******************************************************************************
* 引数: int code 終了コード
* ComVal *pcv 共通変数へのポインタ
* 注釈: ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
*/
void endProc(int code, ComVal *pcv)
{
/* 環境設定の保存 */
(int) **pcv->mzHdl = pcv->mzTask;
(int) **pcv->pcmHdl = pcv->pcmTask;
(int) **pcv->picHdl = pcv->picTask;
**pcv->envHdl = pcv->scrollstep;
*((*pcv->envHdl) + 1) = pcv->cutDisp;
*((*pcv->envHdl) + 2) = pcv->lineDisp;
strcpy((*pcv->mzHdl) + 1, pcv->mzFname);
strcpy((*pcv->mzHdl) + 91, pcv->mzOpt);
strcpy((*pcv->pcmHdl) + 1, pcv->pcmFname);
strcpy((*pcv->pcmHdl) + 91, pcv->pcmOpt);
strcpy((*pcv->picHdl) + 1, pcv->picFname);
strcpy((*pcv->picHdl) + 91, pcv->picOpt);
TSResSave(pcv->lbFname);
if (pcv->menuHdl != NULL)
MMHdlDispose(pcv->menuHdl); /* メニューハンドルを解放する */
if (pcv->hResMap != NULL)
TSResRemove(); /* リソースマップハンドル */
if (pcv->txt != NULL)
MMHdlDispose(pcv->txt); /* テキスト領域のハンドル */
if (pcv->txtNo != NULL)
MMHdlDispose(pcv->txtNo); /* 改行情報のハンドル */
if (pcv->updateRgnHdl != NULL)
GMDisposeRgn(pcv->updateRgnHdl); /* アップデートリージョン
ハンドルの解放 */
if (pcv->txtRgnHdl != NULL)
GMDisposeRgn(pcv->txtRgnHdl); /* テキスト描画リージョン */
if (pcv->winRgnHdl != NULL)
GMDisposeRgn(pcv->winRgnHdl); /* ウィンドウリージョン */
dispoBits(pcv);
/* ウィンドウポインタが確保されたままか? */
if (pcv->windowPtr != NULL)
CMKill(pcv->windowPtr); /* すべてのコントロールを廃棄する */
WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する */
exit(code); /* プログラムを終了する */
}
STR@ u EdEV 3.00 <